package br.com.marcelo.reservasis.client.pagina.apartamento;

import br.com.aroeirasoftware.gwtcomponents.client.components.ASApplication;
import br.com.aroeirasoftware.gwtcomponents.client.components.ASButton;
import br.com.aroeirasoftware.gwtcomponents.client.components.ASComboBox;
import br.com.aroeirasoftware.gwtcomponents.client.components.ASFieldSize;
import br.com.aroeirasoftware.gwtcomponents.client.components.ASForm;
import br.com.aroeirasoftware.gwtcomponents.client.components.ASMessagePanel;
import br.com.aroeirasoftware.gwtcomponents.client.components.ASMessagePanel.ASMessageSeverity;
import br.com.aroeirasoftware.gwtcomponents.client.components.ASOperation;
import br.com.aroeirasoftware.gwtcomponents.client.components.ASPage;
import br.com.aroeirasoftware.gwtcomponents.client.components.ASTogglePanel;
import br.com.aroeirasoftware.gwtcomponents.client.i18n.ASGWTComponentsI18N;
import br.com.marcelo.reservasis.client.i18n.ReservaSISI18N;
import br.com.marcelo.reservasis.client.services.apartamento.ApartamentoUIService;
import br.com.marcelo.reservasis.client.util.ComboBoxUtil;
import br.com.marcelo.reservasis.domain.model.Apartamento;
import br.com.marcelo.reservasis.domain.model.TipoApartamento;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.client.Command;
import com.google.gwt.user.client.rpc.AsyncCallback;
import java.util.HashMap;
import java.util.Map;

/**
 *
 * @author Marcelo
 */
public class ApartamentoCriarAlterarPagina extends ASPage {

    private ASButton bConfirmar;
    private ASButton bCancelar;
    private ClickHandler clickHandler;
    private ASTogglePanel painelPrincipal;
    private ASForm form;
    private ASOperation operacao;
    private Apartamento apartamento;

    public ApartamentoCriarAlterarPagina(ASPage paginaAnterior, ASApplication aplicacao, String titulo, String subtitulo) {
        super(paginaAnterior, aplicacao, titulo, subtitulo);
        this.operacao = ASOperation.CRIACAO;
        apartamento = new Apartamento();
    }

    public ApartamentoCriarAlterarPagina(ASPage paginaAnterior, ASApplication aplicacao, String titulo, String subtitulo, Apartamento apartamento) {
        super(paginaAnterior, aplicacao, titulo, subtitulo);
        this.operacao = ASOperation.ALTERACAO;
        this.apartamento = apartamento;
    }

    @Override
    public void configurarComponentes() {
        clickHandler = new ClickHandler() {

            public void onClick(ClickEvent event) {
                Object source = event.getSource();

                if (source == bConfirmar) {

                    boolean formulariosValidos = isFormulariosValidos();

                    if (!formulariosValidos) {
                        ASMessagePanel.getInstance().exibirMensagem(
                                ASGWTComponentsI18N.messages.msgProblemasFormulario(),
                                ASMessagePanel.ASMessageSeverity.ERRO,
                                ASMessagePanel.ASMessageOption.OK);
                        return;
                    }

                    preparar();

                    if (operacao == ASOperation.CRIACAO) {
                        salvar(apartamento);
                    } else if (operacao == ASOperation.ALTERACAO) {

                        alterar(apartamento);
                    }
                }

                if (source == bCancelar) {
                    fechar();
                }
            }
        };

        form = new ASForm();
        form.setCaption(ReservaSISI18N.messages.gDadosPrincipais());

        form.addCampoTextoNumericoInteiro("numeroApartamento", ReservaSISI18N.messages.numeroApartamento(), true, 9, ASFieldSize.MEDIO);
        form.addCampoTexto("descricao", ReservaSISI18N.messages.descricaoApartamento(), false, ASFieldSize.ENORME);
        form.addCampoTextoNumericoInteiro("numeroQuarto", ReservaSISI18N.messages.numeroQuarto(), false, 9, ASFieldSize.MEDIO);
        form.addCampoOpcoesComboBox("tipoApartamento", ReservaSISI18N.messages.tipoApartamento(), false, true);

        form.focalizarPrimeiroCampo();

        painelPrincipal = new ASTogglePanel(ReservaSISI18N.messages.apartamento());
        painelPrincipal.setWidth("100%");

        painelPrincipal.add(form);

        add(painelPrincipal);

        bConfirmar = new ASButton(ASGWTComponentsI18N.messages.btnConfirmar(), clickHandler);
        bConfirmar.addEstiloDefault();
        bCancelar = new ASButton(ASGWTComponentsI18N.messages.btnCancelar(), clickHandler);

        carregarCombo();

        addComando(bConfirmar);
        addComando(bCancelar);
    }

    @Override
    public void configurarDados() {
        if (operacao == ASOperation.ALTERACAO) {
            ApartamentoUIService.Async.getInstance().getPorId(apartamento.getIdapart(), new AsyncCallback<Apartamento>() {

                public void onFailure(Throwable caught) {
                    ASMessagePanel.getInstance().exibirMensagem("Erro ao recuperar",
                            ASMessageSeverity.ERRO, ASMessagePanel.ASMessageOption.OK);
                }

                public void onSuccess(Apartamento result) {
                    apartamento = result;

                    Map<String, Object> valores = new HashMap<String, Object>();
                    valores.put("numeroApartamento", apartamento.getNumApart());
                    valores.put("descricao", apartamento.getDescricaoApart());
                    valores.put("numeroQuarto", apartamento.getNumQuartosApart());

                    ((ASComboBox<TipoApartamento>) form.getComponenteCampo("tipoApartamento")).setValue(result.getTipoApartamento());

                    form.setValue(valores);
                }
            });
        }
    }

    public void salvar(final Apartamento apartamento) {
        ApartamentoUIService.Async.getInstance().salvar(apartamento, new AsyncCallback<Integer>() {

            public void onFailure(Throwable caught) {
                ASMessagePanel.getInstance().exibirMensagem(
                        ReservaSISI18N.messages.msgErro(
                        ReservaSISI18N.messages.gCriar(), caught),
                        ASMessageSeverity.ERRO, ASMessagePanel.ASMessageOption.OK);
            }

            public void onSuccess(Integer result) {
                apartamento.setIdapart(result);


                ASMessagePanel.getInstance().exibirMensagem(
                        ReservaSISI18N.messages.msgSucesso(
                        ReservaSISI18N.messages.apartamento(),
                        apartamento.getDescricaoApart(),
                        ReservaSISI18N.messages.gCriado()),
                        ASMessageSeverity.SUCESSO, ASMessagePanel.ASMessageOption.OK, new Command() {

                    public void execute() {
                        fechar();
                    }
                });
            }
        });
    }

    public void alterar(final Apartamento apartamento) {
        ApartamentoUIService.Async.getInstance().atualizar(apartamento, new AsyncCallback<Void>() {

            public void onFailure(Throwable caught) {
                ASMessagePanel.getInstance().exibirMensagem(
                        ReservaSISI18N.messages.msgErro(
                        ReservaSISI18N.messages.gAtualizar(), caught),
                        ASMessageSeverity.ERRO, ASMessagePanel.ASMessageOption.OK);
            }

            public void onSuccess(Void result) {

                ASMessagePanel.getInstance().exibirMensagem(
                        ReservaSISI18N.messages.msgSucesso(
                        ReservaSISI18N.messages.apartamento(),
                        apartamento.getDescricaoApart(),
                        ReservaSISI18N.messages.gAtualizado()),
                        ASMessageSeverity.SUCESSO, ASMessagePanel.ASMessageOption.OK, new Command() {

                    public void execute() {
                        fechar();
                    }
                });
            }
        });
    }

    public void preparar() {
        apartamento.setNumApart((Integer) form.getValue().get("numeroApartamento"));
        apartamento.setDescricaoApart((String) form.getValue().get("descricao"));
        apartamento.setNumQuartosApart((Integer) form.getValue().get("numeroQuarto"));
        apartamento.setTipoApartamento(((ASComboBox<TipoApartamento>) form.getComponenteCampo("tipoApartamento")).getValue());
    }

    public void carregarCombo() {
        ComboBoxUtil.preencherComboBoxTipoApartamento((ASComboBox<TipoApartamento>) form.getComponenteCampo("tipoApartamento"));
    }

    public boolean isFormulariosValidos() {
        boolean result = true;
        if (!form.isValido()) {
            result = false;
        }
        return result;
    }

    public void remove(ASForm fom) {
        painelPrincipal.remove(fom);
    }
}
